package com.gdust.lease.web.admin.custom.config;

import io.swagger.v3.oas.models.OpenAPI;
import io.swagger.v3.oas.models.info.Info;
import org.springdoc.core.models.GroupedOpenApi;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * ClassName: Knife4jConfiguration
 * Package: com.gdust.lease.web.admin.custom.config
 * Description: Knife4j 配置类，用于定义后台管理系统的 API 文档分组
 * 说明：后台管理系统和移动端的接口配置有所不同，因此需要分别定义独立的配置类
 *
 * @Author syun
 * @Create 2025/1/1 14:18
 * @Version 1.0
 */
@Configuration // 标识为 Spring 的配置类
public class Knife4jConfiguration {

    /**
     * 配置全局的 OpenAPI 对象，用于定义 API 文档的基本信息
     *
     * @return OpenAPI 实例，包含标题、版本号及描述信息
     */
    @Bean
    public OpenAPI customOpenAPI() {
        return new OpenAPI().info(
                new Info()
                        .title("后台管理系统API") // API 文档的标题
                        .version("1.0") // API 文档的版本号
                        .description("后台管理系统API") // API 文档的描述
        );
    }

    /**
     * 定义 "系统信息管理" 分组，包含与系统相关的所有接口
     *
     * @return GroupedOpenApi 对象，用于配置接口分组信息
     */
    @Bean
    public GroupedOpenApi systemAPI() {
        return GroupedOpenApi.builder()
                .group("系统信息管理") // 分组名称
                .pathsToMatch("/admin/system/**") // 匹配的接口路径
                .build();
    }

    /**
     * 定义 "后台登录管理" 分组，包含与登录及用户信息相关的接口
     *
     * @return GroupedOpenApi 对象，用于配置接口分组信息
     */
    @Bean
    public GroupedOpenApi loginAPI() {
        return GroupedOpenApi.builder()
                .group("后台登录管理") // 分组名称
                .pathsToMatch(
                        "/admin/login/**", // 登录相关接口路径
                        "/admin/info" // 用户信息接口路径
                )
                .build();
    }

    /**
     * 定义 "公寓信息管理" 分组，包含与公寓、房间及设施等相关的接口
     *
     * @return GroupedOpenApi 对象，用于配置接口分组信息
     */
    @Bean
    public GroupedOpenApi apartmentAPI() {
        return GroupedOpenApi.builder()
                .group("公寓信息管理") // 分组名称
                .pathsToMatch(
                        "/admin/apartment/**", // 公寓信息相关接口
                        "/admin/room/**", // 房间信息相关接口
                        "/admin/label/**", // 标签相关接口
                        "/admin/facility/**", // 设施相关接口
                        "/admin/fee/**", // 费用相关接口
                        "/admin/attr/**", // 属性相关接口
                        "/admin/payment/**", // 支付相关接口
                        "/admin/region/**", // 区域信息相关接口
                        "/admin/term/**", // 租赁条款相关接口
                        "/admin/file/**" // 文件管理相关接口
                )
                .build();
    }

    /**
     * 定义 "租赁信息管理" 分组，包含与预约及租赁协议相关的接口
     *
     * @return GroupedOpenApi 对象，用于配置接口分组信息
     */
    @Bean
    public GroupedOpenApi leaseAPI() {
        return GroupedOpenApi.builder()
                .group("租赁信息管理") // 分组名称
                .pathsToMatch(
                        "/admin/appointment/**", // 预约相关接口
                        "/admin/agreement/**" // 租赁协议相关接口
                )
                .build();
    }

    /**
     * 定义 "平台用户管理" 分组，包含与平台用户相关的接口
     *
     * @return GroupedOpenApi 对象，用于配置接口分组信息
     */
    @Bean
    public GroupedOpenApi userAPI() {
        return GroupedOpenApi.builder()
                .group("平台用户管理") // 分组名称
                .pathsToMatch(
                        "/admin/user/**" // 用户管理相关接口
                )
                .build();
    }
}
